package com.summer.data.demo.service;

import com.summer.data.Jsql;
import com.summer.data.rs.datatype.MapPage;
import com.summer.data.spring.SessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Map;
import java.util.UUID;

@Service
public class TeacherService {

    @Autowired
    SessionTemplate sessionTemplate;

    public MapPage pageTeachers() {

        Jsql jsql = Jsql.create()
                .append("select * from sd_teacher");

        return sessionTemplate.pageQuery(jsql);
    }

    public Map<String, Object> getTeacherById(String id) {
        Jsql jsql = Jsql.create()
                .append("select * from sd_teacher where id = ?", id);
        return sessionTemplate.find(jsql);
    }

    @Transactional
    public Integer addTeacher(String teacherName) {

        String teacherId = UUID.randomUUID().toString();

        Jsql jsql = Jsql.create()
                .append("insert into sd_teacher(teacherId, teacherName) values(?, ?)",
                        teacherId, teacherName
                );
        return sessionTemplate.executeUpdate(jsql);
    }

    @Transactional
    public Integer updateTeacher(String teacherId, String teacherName) {
        Jsql jsql = Jsql.create()
                .append("update sd_teacher ")
                .append("   set teacherName = ? ", teacherName)
                .append(" where teacherId = ? ", teacherId);
        return sessionTemplate.executeUpdate(jsql);
    }

    @Transactional
    public Integer delTeacher(String teacherId) {
        Jsql jsql = Jsql.create()
                .append("delete sd_teacher ")
                .append(" where teacherId = ? ", teacherId);
        return sessionTemplate.executeUpdate(jsql);
    }

    public void query2() {
//        Jql jql = Jql
//                .with(Prod.class, ProdDetail.class)
//                .then((t1, t2) -> new Jql(){{
//                    select(t1.prod_name, t1.prod_desc);
//                    select(t2);
//                    distinct();
//                    from(t1);
//                    join(t2).on(
//                            t1.res_id.eq(t2.prod_res_id)
//                    );
//                    where(
//                            t1.res_id.notEq(100),
//                            t1.prod_name.isNotNull()
//                    );
//                    and(t1.res_id.lt(200));
//                    and(t1.prod_name.like("中文"));
//                    or(t1.res_id.in(1, 2, 3));
//                    order(t2.detail_name.desc());
//
//
//                }});
//        jql.query();
    }

    public void constValue() {
//        Prod t1 = new Prod();
//        Jql jql = new Jql(){{
//            select(Value.use(100).alias("int_value"));
//            select(Value.use("我是常量").alias("string_value"));
//            from(t1);
//            where(t1.res_id().eq(1));
//        }};
//        jql.query();
        //
    }

    public void groupQuery() {
//        Prod t1 = new Prod();
//        ProdDetail t2 = new ProdDetail();
//
//        Count cnt = Func.count(t2.res_id);
//        Jql jql = new Jql() {{
//            select(t1.prod_name, cnt.alias("CNT"));
//            from(t1);
//            join(t2).on(t1.res_id.eq(t2.prod_res_id));
//            group(t1.prod_name);
//            having(cnt.eq(100));
//        }};
//        jql.query();
    }

    public void caseWhen() {
//        Prod t1 = new Prod();
//
//        CaseWhen caseWhen = Func.caseWhen(t1.res_id.eq(1), "1")
//                .cashWhen(t1.res_id.eq(2), "2")
//                .other("3");
//
//
//
//        Jql jql = new Jql(){{
//            select(caseWhen.alias("xy"));
//            from(t1);
//            where(t1.res_id.eq(1));
//        }};
//        jql.query();
        //
    }

    public void fun1() {
//        Prod t1 = new Prod();
//
//        Concat concat = Func.concat(t1.prod_name);
//        Nvl nvl = Func.nvl(t1.prod_desc, t1.prod_name);
//        Count count = Func.count(t1.res_id);
//        Sum sum = Func.sum(t1.res_id);
//        Lower lower = Func.lower(t1.prod_name);
//        Upper upper = Func.upper(t1.prod_name);
//
//        Jql jql = new Jql(){{
//            select(concat.alias("f1"));
//            select(nvl.alias("f2"));
//            select(count.alias("f3"));
//            select(sum.alias("f4"));
//            select(lower.alias("f5"));
//            select(upper.alias("f6"));
//            from(t1);
//            where(t1.res_id.eq(1));
//        }};
//
//        jql.query();
        //
    }

    public void subquery() {

//        Prod t1 = new Prod();
//        ProdDetail t2 = new ProdDetail();
//
//        Jql jql1 = new Jql(){{
//            select(t1.res_id);
//            from(t1);
//            where(t1.res_id.between(1, 100));
//        }};
//
//        Jql jql2 = new Jql(){{
//            select(t2);
//            from(t2);
//            where(t2.prod_res_id.in(jql1));
//
//        }};
//
//        jql2.query();
        //
    }

    public void datasetQuery() {

//        Prod t1 = new Prod();
//        Jql jql1 = new Jql(){{
//            select(t1);
//            from(t1);
//            where(t1.res_id.lt(100));
//        }};
//        Jql jql2 = new Jql(){{
//            select(t1);
//            from(t1);
//            where(t1.res_id.gtEq(100));
//        }};
//
//        // 并集
//        jql1.union(jql2);
//        jql1.unionAll(jql2);
//
//        // 差集
//        jql1.minus(jql2);
//        // 交集
//        jql1.interSect(jql2);
//        // 除去
//        jql1.except(jql2);

    }
}
